

#include "TDAListaCorreo.h"
#include <string.h>
#include <stdlib.h>


void LC_Crear (TListaCorreo *pLc){

    pLc->Corriente = NULL;
    pLc->Primero = NULL;
}


void LC_Vaciar(TListaCorreo *pLc){

    TNodoCorreo *pNodo, *Siguiente;
    for (pNodo = pLc->Primero;(pNodo);pNodo = Siguiente)
    {
        Siguiente = pNodo->Siguiente;
        free(pNodo);
    }
    pLc->Primero = pLc->Corriente = NULL;

}

int LC_Vacia(TListaCorreo Lc){

    return (Lc.Primero == NULL);
}

void LC_ObtenerCorriente(TListaCorreo Lc, TDACorreo *correo){

     /* Defino variables auxiliares para los campos del correo, si bien *
     * puedo acceder directamente con "correo.<attr>" es recomendable  *
     * no tener interaccion directa con el correo y valerse de los     *
     * getterS correspondientes.
     */
    char remitente[MAX_ADDR_SIZE];
    char dest[MAX_ADDR_SIZE];
    char asunto[MAX_SUBJECT_SIZE];
    char cuerpo[MAX_BODY_SIZE];
    char filename[MAX_FILENAME];
    time_t fechaHora;
    int i=0;

    TDACorreo *aux;

    aux = &(Lc.Corriente->Elem);

    getAsunto(*aux, asunto);
    getTextoCuerpo(*aux, cuerpo);
    getRemitente(*aux, remitente);
    getFilename(*aux, filename);
    fechaHora = getFechaHoraEnviado(*aux);

    setTextoCuerpo( correo, cuerpo);
    setAsunto(correo, asunto);
    setRemitente(correo, remitente);
    setFilename(correo, filename);

    setFechaHoraEnviado(correo, fechaHora);

    correo->qtyDest = getCantidadDestinatarios(*aux);

    for ( ; i < getCantidadDestinatarios(*aux) ; i++){
        getDestinatarioX(aux, dest, i);
        strcpy(correo->destinatarios[i],dest);
    }

}

int LC_MoverCorriente (TListaCorreo *pLc, LC_Movimiento Mov){

    switch (Mov)
    {
        case LO_PRIMERO:    pLc->Corriente = pLc->Primero;
                            break;
        case LO_SIGUIENTE:  if (pLc->Corriente->Siguiente == NULL)
                            return 0;
                            else
                            pLc->Corriente = pLc->Corriente->Siguiente;
                            break;
        case LO_ANTERIOR:   return FALSE;
    }
    return TRUE;
}


void LC_BorrarCorriente(TListaCorreo *pLc){

    TNodoCorreo *PNodo = pLc->Corriente;

    if (pLc->Corriente == pLc->Primero)
    {
        pLc->Primero = pLc->Corriente->Siguiente;
        pLc->Corriente = pLc->Primero;
    }
    else
    {
        TNodoCorreo *TNAux = pLc->Primero;
        while (TNAux->Siguiente != pLc->Corriente)
        {
            TNAux = TNAux->Siguiente;
        }
        TNAux->Siguiente = pLc->Corriente->Siguiente;
        if (TNAux->Siguiente)
        {
            pLc->Corriente = TNAux->Siguiente;
        }
        pLc->Corriente = TNAux;
    }
    free(PNodo);

}

int LC_Insertar(TListaCorreo *pLc, LC_Movimiento Mov, TDACorreo *pC){

    TNodoCorreo *pNodo = (TNodoCorreo*) malloc(sizeof (TNodoCorreo));

    char remitente[MAX_ADDR_SIZE];
    char dest[MAX_ADDR_SIZE];
    char asunto[MAX_SUBJECT_SIZE];
    char cuerpo[MAX_BODY_SIZE];
    char filename[MAX_FILENAME];
    time_t fechaHora;
    int i=0;

    TDACorreo *aux;


    if (!pNodo)
    {
        return FALSE;
    }
    if ((pLc->Primero == NULL) || (Mov == LO_PRIMERO) || ((Mov == LO_ANTERIOR) && (pLc->Primero == pLc->Corriente)))
    {
        pNodo->Siguiente = NULL;
        pLc->Primero = pLc->Corriente = pNodo;
    }
    else
    {
        if( Mov == LO_SIGUIENTE )
        {
            if ( pC->fechaHora > pLc->Corriente->Elem.fechaHora ){
                pNodo->Siguiente = NULL;
                pLc->Corriente->Siguiente = pNodo;
            }else{

                pNodo->Siguiente = pLc->Corriente;
                pLc->Primero = pLc->Corriente = pNodo;
            }

        }

    }

    getAsunto(*pC, asunto);
    getTextoCuerpo(*pC, cuerpo);
    getRemitente(*pC, remitente);
    getFilename(*pC, filename);
    fechaHora = getFechaHoraEnviado(*pC);

    setTextoCuerpo( &(pNodo->Elem), cuerpo);
    setAsunto( &(pNodo->Elem), asunto);
    setRemitente( &(pNodo->Elem), remitente);
    setFilename( &(pNodo->Elem), filename);

    setFechaHoraEnviado( &(pNodo->Elem), fechaHora);

    aux = &(pNodo->Elem);

    aux->qtyDest = getCantidadDestinatarios(*pC);

    for ( ; i < getCantidadDestinatarios(*pC) ; i++){
        getDestinatarioX(pC, dest, i);
        strcpy(aux->destinatarios[i],dest);
    }

    pLc->Corriente = pNodo;
    return TRUE;

}



void printListaCorreo(TListaCorreo *pLc){

    TDACorreo correo;

    if( !LC_Vacia(*pLc) ){
        LC_MoverCorriente(pLc, LO_PRIMERO);
    }

    LC_ObtenerCorriente(*pLc, &correo);

    while( LC_MoverCorriente(pLc, LO_SIGUIENTE) ){
        LC_ObtenerCorriente(*pLc, &correo);

    }

}



